#include "fenetreopengl.h"


//--------------------- Constructeurs et destructeur -------------------
/*
 * Constructeur de la fenetre
 * @param framePerSecond : temps de rafraichissement de la fenetre (images par seconde)
 * @param parent : QWidget parent de cette fenêtre
 * @param name : nom de la fenetre
 */
FenetreOpengl::FenetreOpengl(int framesPerSecond, QWidget *parent, char *name)
    : QGLWidget(parent)
{
    //On initialise la scène
    _scene = new Scene();

    //On donne un titre à la fenêtre
    setWindowTitle(QString::fromUtf8(name));

    //On définit notre timer pour le rafraichissement de notre fenêtre
    if(framesPerSecond == 0)
        _timer = NULL;
    else
    {
        int seconde = 1000; // 1 seconde = 1000 ms
        int intervale = seconde / framesPerSecond;
        _timer = new QTimer(this);
        //connect(_timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()));
        _timer->start(intervale);
    }
}

/*
 * Destructeur de la fenetre
 */
FenetreOpengl::~FenetreOpengl()
{
    delete _timer;
    delete _scene;
}

//----------------------------------------------------------------------
//--------------------- Méthodes ---------------------------------------

/*
 * Fonction permettant d'initialiser notre fenetre opengl
 */
void FenetreOpengl::initializeGL()
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

/*
 * Fonction permettant de redimensionner correctement
 * notre fenêtre opengl
 * @param width : nouvelle longueur de la fenêtre
 * @param height : nouvelle hauteur de la hauteur
 */
void FenetreOpengl::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/*
 * Fonction de dessin
 */
void FenetreOpengl::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(-1.5f, 0.0f, -6.0f);

    _scene->dessiner();

     glBegin(GL_QUADS);
        //devant
        glVertex3f(-1.0,-1.0,-1.0);
        glVertex3f(1.0,-1.0,-1.0);
        glVertex3f(1.0,1.0,-1.0);
        glVertex3f(-1.0,1.0,-1.0);

        //derriere
        glVertex3f(-1.0,-1.0,1.0);
        glVertex3f(1.0,-1.0,1.0);
        glVertex3f(1.0,1.0,1.0);
        glVertex3f(-1.0,1.0,1.0);

        //gauche
        glVertex3f(-1.0,-1.0,-1.0);
        glVertex3f(-1.0,1.0,-1.0);
        glVertex3f(-1.0,1.0,1.0);
        glVertex3f(-1.0,-1.0,1.0);

        //droite
        glVertex3f(1.0,-1.0,-1.0);
        glVertex3f(1.0,1.0,-1.0);
        glVertex3f(1.0,1.0,1.0);
        glVertex3f(1.0,-1.0,1.0);

        //dessus
        glVertex3f(-1.0,1.0,-1.0);
        glVertex3f(1.0,1.0,-1.0);
        glVertex3f(1.0,1.0,1.0);
        glVertex3f(-1.0,1.0,1.0);

        //dessous
        glVertex3f(-1.0,-1.0,-1.0);
        glVertex3f(1.0,-1.0,-1.0);
        glVertex3f(1.0,-1.0,1.0);
        glVertex3f(-1.0,-1.0,1.0);

    glEnd();
}

/*
 * Fonction récupérant l'évènement de l'appuie d'une touche sur le clavier
 * @param keyEvent : touche pressée
 */
void FenetreOpengl::keyPressEvent( QKeyEvent *keyEvent )
{


}

//----------------------------------------------------------------------

//--------------------- Slots  -----------------------------------------

/*
 * Slot permettant de récupérer l'évènement du timer pour rafraichir la fenetre
 */
void FenetreOpengl::timerTermine()
{
    updateGL();
}

//----------------------------------------------------------------------

//--------------------- Accesseurs -------------------------------------

/*
 * Accesseur sur la scène
 * @return scene : la scene de la fenetre
 */
Scene& FenetreOpengl::getScene()
{
    return *_scene;
}

/*
 * Setteur sur la scène
 * @param scene : scene à affecter
 */
void FenetreOpengl::setScene(Scene& scene)
{
    _scene = &scene;
}

//----------------------------------------------------------------------
//--------------------- Surcharge des opérateurs -----------------------

//----------------------------------------------------------------------


